package com.itheima.filter;

import com.itheima.bean.Employee;
import com.itheima.bean.User;
import com.itheima.config.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 *  定义过滤器，用来过滤登录的功能
 *      1、定义类，实现接口filter
 *      2、实现方法doFilter
 *      3、类上打注解@WebFilter，过滤地址 /*
 *      4、默认情况下，springboot的环境是不认为这这些过滤器的，需要在启动类上面打上注解@ServletComponentScan
 *
 *      5、步骤：
 *          5.1 获取当前的请求地址
 *          5.2 判定请求地址是否要处理，如果不需要处理就直接放行
 *          5.3 如果属于要处理的地址，接着继续判断是否有登录
 *              5.3.1 如果没有登录，就直接重定向到登录页面
 *              5.3.2 如果已经登录了，那么就直接放行
 */
@WebFilter("/*")
@Slf4j
public class LoginFilter implements Filter {


    /*private AntPathMatcher pm = new AntPathMatcher();

    //定义出来放行的规则
    String [] paths = {
            "/backend/page/login/login.html",
            "/employee/login",
            "/employee/logout",
            "/**.css", "/**.js","/**.png","/**.jpg", "/**plugins*" , "/**ico*"
    };*/
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.debug("来了一个请求了~！~！~~~Filter=" + Thread.currentThread().getId());//拿线程的id

        //1、获取当前的请求地址
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse resp = (HttpServletResponse)servletResponse;
        String uri = req.getRequestURI();
        System.out.println("现在访问的地址是：" + uri);

        //2、判断地址是否要处理，如果访问的是登录页面，或者现在正在执行登录 | 退出登录操作，那么就放行它
        if (uri.contains("login") || uri.contains("logout") || uri.endsWith(".css")
        || uri.endsWith(".js") || uri.endsWith(".png") || uri.endsWith(".jpg")
        || uri.contains("plugins") || uri.contains("ico") || uri.contains("sms")
        || uri.contains("/v2/api-docs")||uri.contains("webjars/**")
        || uri.contains("/swagger-resources")||uri.contains("/doc.html")){
            filterChain.doFilter(servletRequest, servletResponse);
            return ;//表示后面的代码不要走了 。
        }

        /*// 从规则里面遍历每一个规则出来，然后让pm去匹配我们现在的请求地址
        boolean flag = false;
        for (String p : paths) {
            if(flag = pm.match(p , uri)){
                break;
            }
        }
        if(flag ){
            filterChain.doFilter(servletRequest , servletResponse);
            return ; //表示后面的代码不要走了。
        }*/

        //3、判断是否已经登录了？如果没有登录，那么就要去往登录页面。
        Employee employee = (Employee)req.getSession().getAttribute("employee");
        if (employee != null){

            //把员工的id保存到ThreadLocal里面去
            BaseContext.set(employee.getId());


            filterChain.doFilter(servletRequest,servletResponse);
            return ; //表示后面的代码不要走了
        }
        //4、判定用户是否已经登录
        User user = (User) req.getSession().getAttribute("user");
        if (user != null) {//认为这个用户已经登录过了
            //用户的id也保存起来到ThreadLocal里面去
            BaseContext.set(user.getId());

            filterChain.doFilter(servletRequest,servletResponse);
            return ; //表示后面的代码不要走了
        }


        //5、如果到了这里，就表示没有登录
        if (uri.contains("front")){
            //前端的用户登录页面
            resp.sendRedirect("/front/page/login.html");
        } else {
            //后端的用户登录页面
            resp.sendRedirect("/backend/page/login/login.html");
        }
    }
}
